package cn.drh.charging.order.job;


import cn.drh.charging.common.pojo.param.GunStatusUpdateParam;
import cn.drh.charging.order.constant.Constant;
import cn.drh.charging.order.dao.repository.OrderRepository;
import cn.drh.charging.order.pojo.po.ChargingBillFailPO;
import cn.drh.charging.order.pojo.po.ChargingBillSuccessPO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;
import java.util.UUID;

/**
 * @ClassName DeviceCheckJob
 * @Description TODO
 * @Author renhong~Deng
 * @Date 2025/6/5 14:55
 * @Version 1.0
 * 设备自检任务
 */

@Slf4j
public class DeviceCheckJob implements Job {

    /**
     * 必须有无参构造器
     */
    public DeviceCheckJob() {
    }

    /**
     * 自检任务的构造器 创建任务,设置时间
     * 入参
     * 订单信息 订单号
     * 设备信息 枪id
     *
     * @param orderNo
     * @param gunId
     */
    public DeviceCheckJob(String orderNo, Integer gunId) throws Exception {


        log.debug("添加设备自检定时任务:订单号-{},枪id-{}", orderNo, gunId);
        //创建调度器工厂
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        //通过调度器工厂获取调度器
        Scheduler scheduler = schedulerFactory.getScheduler();

        //创建定时任务
        JobDetail jobDetail = JobBuilder.newJob(DeviceCheckJob.class)
                //定义定时任务的名称和组
                .withIdentity("DeviceCheckJob" + UUID.randomUUID(), "device_check_job")
                //传入订单号
                .usingJobData("orderNo", orderNo)
                //插入枪id
                .usingJobData("gunId", gunId)
                .build();

        //设备自检需要1分钟  模拟
        long deviceCheckTime = 1 * 60 * 1000;
        //当前时间
        long now = System.currentTimeMillis();
        //任务触发的时间
        Date triggerTime = new Date(now + deviceCheckTime);
        //创建触发器 并设置时间
        Trigger trigger = TriggerBuilder.newTrigger().startAt(triggerTime).build();

        //调度器 把 任务和触发器  绑定
        scheduler.scheduleJob(jobDetail, trigger);
        //启动调度器
        scheduler.start();
    }

    /**
     * 执行 干一些事情
     *
     * @param context
     * @throws JobExecutionException
     */
    @Override
    public void execute(JobExecutionContext context) {
        log.debug("设备自检任务开始执行:{}", context);
        //订单号从哪儿来？
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        String orderNo = jobDataMap.getString("orderNo");
        Integer gunId = jobDataMap.getInt("gunId");

        //DeviceCheckJob 没有在容器中，可以通过 applicationContext 从容器获取 orderRepository
        OrderRepository orderRepository = SpringContextJobUtils.getBean("orderRepository", OrderRepository.class);
        //7.判断是否有订单记录
        //8.如果有成功订单记录 不用管 无需处理 设备有响应 ，设备给订单服务发送了开始充电成功的响应
        //9.如果没有成功订单记录
        //10.判断是否有失败订单记录  设备有响应，设备给订单服务发送了开始充电失败指令
        //11.如果有失败订单记录 故障原因 设备故障-无法充电， 不用管 ，无需处理
        //12.如果没有失败订单记录 插入失败订单记录 故障原因 设备无响应
        //获取成功订单记录
        ChargingBillSuccessPO chargingBillSuccessPO = orderRepository.getSuccessOrder(orderNo);
        //判断是否有订单记录
        if (chargingBillSuccessPO == null) {
            log.debug("没有成功订单记录");
            //9.如果没有成功订单记录
            ChargingBillFailPO chargingBillFailPO = orderRepository.getFailOrder(orderNo);
            //10.判断是否有失败订单记录
            if (chargingBillFailPO == null) {
                //12.如果没有失败订单记录 插入失败订单记录  故障原因 设备无响应
                ChargingBillFailPO chargingBillFailPO1 = new ChargingBillFailPO();
                chargingBillFailPO1.setBillId(orderNo);
                chargingBillFailPO1.setFailDesc("设备无响应");
                orderRepository.saveFailOrder(chargingBillFailPO1);
                log.debug("设备自检失败，没有失败订单记录,插入失败订单记录,故障原因 设备无响应");

                //修改设备状态为 故障 通知维修人员
                log.debug("修改设备状态为故障：枪id：{}，状态：{}",  gunId, Constant.GUN_STATS_ERROR);
                GunStatusUpdateParam gunStatusUpdateParam = new GunStatusUpdateParam();
                gunStatusUpdateParam.setGunId(gunId);
                gunStatusUpdateParam.setStatus(Constant.GUN_STATS_ERROR);
                log.debug("修改设备状态为故障：枪id：{}，状态：{} ,成功", gunId, Constant.GUN_STATS_ERROR);


            } else {
                log.debug("有失败订单记录,设备自检失败，有响应，无法充电");
            }
        } else {
            log.debug("有成功订单记录,设备自检成功，有响应，能充电");
            log.debug("更新设备信息到订单表，枪id:{},订单编号：{} 这里不是必须的操作，作为演示", orderNo, gunId);
            orderRepository.updateDeviceInfo(orderNo, gunId);
            log.debug("更新设备信息到订单表,成功，枪id:{},订单编号：{} 这里不是必须的操作，作为演示", orderNo, gunId);
        }

    }
}
